(function () {
    "use strict";

    angular.module('core').controller('dashboardGerencialController', controller);
    controller.$inject = ['$scope', '$filter', '$timeout', 'toolsService', 'vendaVarejoService', 'lookupService'];

    function controller($scope, $filter, $timeout, toolsService, vendaVarejoService, lookupService) {
        $scope.initializeLayout('Dashboard Gerencial');

        $scope.state = {
            filtro: {
                ativo: false,
            },
        };
        $scope.tabs = {
            enum: {
                vendas: 0,
                vendedores: 1,
                produtos: 2,
                fidelidade: 3,
                crm: 4,
            },
            corrente: 0,
            select: function (index) {
                $scope.tabs.corrente = index;
                $scope.refresh();
            },
        };
        $scope.charts = {
            totais: {
                ValorPago: null,
                ValorMeta: null,
                NumeroVendas: null,
                ValorPorAtendimento: null,
                PecasPorAtendimento: null,
                PercentualTroca: null,
                PrecoMedio: null,
                QuantidadeVenda: null,
                getAll: function () {
                    vendaVarejoService
                        .getSumario($scope.state.filtro.args)
                        .then(
                        function (response) {
                            if (response.Status < 0) {
                                $scope.tools.toastr.error(response.Message, 'Serviço');
                            } else {
                                $scope.charts.totais.ValorPago = response.Data.ValorPago;
                                $scope.charts.totais.ValorMeta = response.Data.ValorMeta;
                                $scope.charts.totais.NumeroVendas = response.Data.NumeroVendas;
                                $scope.charts.totais.ValorPorAtendimento = response.Data.ValorPorAtendimento;
                                $scope.charts.totais.PecasPorAtendimento = response.Data.PecasPorAtendimento;
                                $scope.charts.totais.PercentualTroca = response.Data.PercentualTroca;
                                $scope.charts.totais.PrecoMedio = response.Data.PrecoMedio;
                                $scope.charts.totais.QuantidadeVenda = response.Data.QuantidadeVenda;
                            }
                        },
                        function (_error) {
                            $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                        });
                },
            },
            evolucaoVenda: {
                carregando: false,
                vazio: false,
                fillChart: function () {
                    $scope.charts.evolucaoVenda.carregando = true;
                    $scope.charts.evolucaoVenda.vazio = false;
                    vendaVarejoService
                        .chartEvolucaoVenda($scope.state.filtro.args)
                        .then(
                        function (response) {
                            if (response.Status < 0) {
                                $scope.tools.toastr.error(response.Message, 'Serviço');
                                console.error(response.Exception);
                            } else {
                                $timeout(function () {
                                    $scope.charts.evolucaoVenda.vazio =
                                        toolsService.buildChart("#chart-evolucao-venda", "R$", response.Data);
                                });
                            }
                            $scope.charts.evolucaoVenda.carregando = false;
                        },
                        function (_error) {
                            $scope.charts.evolucaoVenda.carregando = false;
                            $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                            console.error(_error);
                        }
                        );
                },
            },
            evolucaoVendaAcumulada: {
                carregando: false,
                vazio: false,
                fillChart: function () {
                    $scope.charts.evolucaoVendaAcumulada.carregando = true;
                    $scope.charts.evolucaoVendaAcumulada.vazio = false;
                    vendaVarejoService
                        .chartEvolucaoVendaAcumulada($scope.state.filtro.args)
                        .then(
                        function (response) {
                            if (response.Status < 0) {
                                $scope.tools.toastr.error(response.Message, 'Serviço');
                                console.error(response.Exception);
                            } else {
                                $timeout(function () {
                                    $scope.charts.evolucaoVendaAcumulada.vazio =
                                        toolsService.buildChart("#chart-evolucao-venda-acumulada", "R$", response.Data);
                                });
                            }
                            $scope.charts.evolucaoVendaAcumulada.carregando = false;
                        },
                        function (_error) {
                            $scope.charts.evolucaoVendaAcumulada.carregando = false;
                            $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                            console.error(_error);
                        }
                        );
                },
            },
            grupo: {
                carregando: false,
                vazio: false,
                fillChart: function () {
                    $scope.charts.grupo.carregando = true;
                    $scope.charts.grupo.vazio = false;
                    /* comproe o filtro do desempenho de vendedor que é baseado em ItemVendaVarejo */
                    var args = {
                        filtro: {
                            VendaVarejo: $scope.state.filtro.args.filtro,
                        },
                        tipoPeriodo: $scope.state.filtro.args.tipoPeriodo,
                        periodo: $scope.state.filtro.args.periodo,
                    };

                    vendaVarejoService
                        .chartGrupo(args)
                        .then(
                        function (response) {
                            if (response.Status < 0) {
                                $scope.tools.toastr.error(response.Message, 'Serviço');
                                console.error(response.Exception);
                            } else {
                                $timeout(function () {
                                    $scope.charts.grupo.vazio =
                                        toolsService.buildChart("#chart-grupo", "R$", response.Data);
                                });
                            }
                            $scope.charts.grupo.carregando = false;
                        },
                        function (_error) {
                            $scope.charts.grupo.carregando = false;
                            $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                            console.error(_error);
                        }
                        );
                },
            },
            subgrupo: {
                carregando: false,
                vazio: false,
                fillChart: function () {
                    $scope.charts.subgrupo.carregando = true;
                    $scope.charts.subgrupo.vazio = false;
                    /* comproe o filtro do desempenho de vendedor que é baseado em ItemVendaVarejo */
                    var args = {
                        filtro: {
                            VendaVarejo: $scope.state.filtro.args.filtro,
                        },
                        tipoPeriodo: $scope.state.filtro.args.tipoPeriodo,
                        periodo: $scope.state.filtro.args.periodo,
                    };

                    vendaVarejoService
                        .chartSubgrupo(args)
                        .then(
                        function (response) {
                            if (response.Status < 0) {
                                $scope.tools.toastr.error(response.Message, 'Serviço');
                                console.error(response.Exception);
                            } else {
                                $timeout(function () {
                                    $scope.charts.subgrupo.vazio =
                                        toolsService.buildChart("#chart-subgrupo", "R$", response.Data);
                                });
                            }
                            $scope.charts.subgrupo.carregando = false;
                        },
                        function (_error) {
                            $scope.charts.subgrupo.carregando = false;
                            $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                            console.error(_error);
                        }
                        );
                },
            },
            tipo: {
                carregando: false,
                vazio: false,
                fillChart: function () {
                    $scope.charts.tipo.carregando = true;
                    $scope.charts.tipo.vazio = false;
                    /* comproe o filtro do desempenho de vendedor que é baseado em ItemVendaVarejo */
                    var args = {
                        filtro: {
                            VendaVarejo: $scope.state.filtro.args.filtro,
                        },
                        tipoPeriodo: $scope.state.filtro.args.tipoPeriodo,
                        periodo: $scope.state.filtro.args.periodo,
                    };

                    vendaVarejoService
                        .chartTipo(args)
                        .then(
                        function (response) {
                            if (response.Status < 0) {
                                $scope.tools.toastr.error(response.Message, 'Serviço');
                                console.error(response.Exception);
                            } else {
                                $timeout(function () {
                                    $scope.charts.tipo.vazio =
                                        toolsService.buildChart("#chart-tipo", "R$", response.Data);
                                });
                            }
                            $scope.charts.tipo.carregando = false;
                        },
                        function (_error) {
                            $scope.charts.tipo.carregando = false;
                            $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                            console.error(_error);
                        }
                        );
                },
            },
            colecao: {
                carregando: false,
                vazio: false,
                fillChart: function () {
                    $scope.charts.colecao.carregando = true;
                    $scope.charts.colecao.vazio = false;
                    /* comproe o filtro do desempenho de vendedor que é baseado em ItemVendaVarejo */
                    var args = {
                        filtro: {
                            VendaVarejo: $scope.state.filtro.args.filtro,
                        },
                        tipoPeriodo: $scope.state.filtro.args.tipoPeriodo,
                        periodo: $scope.state.filtro.args.periodo,
                    };

                    vendaVarejoService
                        .chartColecao(args)
                        .then(
                        function (response) {
                            if (response.Status < 0) {
                                $scope.tools.toastr.error(response.Message, 'Serviço');
                                console.error(response.Exception);
                            } else {
                                $timeout(function () {
                                    $scope.charts.colecao.vazio =
                                        toolsService.buildChart("#chart-colecao", "R$", response.Data);
                                });
                            }
                            $scope.charts.colecao.carregando = false;
                        },
                        function (_error) {
                            $scope.charts.colecao.carregando = false;
                            $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                            console.error(_error);
                        }
                        );
                },
            },
            linha: {
                carregando: false,
                vazio: false,
                fillChart: function () {
                    $scope.charts.linha.carregando = true;
                    $scope.charts.linha.vazio = false;
                    /* comproe o filtro do desempenho de vendedor que é baseado em ItemVendaVarejo */
                    var args = {
                        filtro: {
                            VendaVarejo: $scope.state.filtro.args.filtro,
                        },
                        tipoPeriodo: $scope.state.filtro.args.tipoPeriodo,
                        periodo: $scope.state.filtro.args.periodo,
                    };

                    vendaVarejoService
                        .chartLinha(args)
                        .then(
                        function (response) {
                            if (response.Status < 0) {
                                $scope.tools.toastr.error(response.Message, 'Serviço');
                                console.error(response.Exception);
                            } else {
                                $timeout(function () {
                                    $scope.charts.linha.vazio =
                                        toolsService.buildChart("#chart-linha", "R$", response.Data);
                                });
                            }
                            $scope.charts.linha.carregando = false;
                        },
                        function (_error) {
                            $scope.charts.linha.carregando = false;
                            $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                            console.error(_error);
                        }
                        );
                },
            },
            marca: {
                carregando: false,
                vazio: false,
                fillChart: function () {
                    $scope.charts.marca.carregando = true;
                    $scope.charts.marca.vazio = false;
                    /* comproe o filtro do desempenho de vendedor que é baseado em ItemVendaVarejo */
                    var args = {
                        filtro: {
                            VendaVarejo: $scope.state.filtro.args.filtro,
                        },
                        tipoPeriodo: $scope.state.filtro.args.tipoPeriodo,
                        periodo: $scope.state.filtro.args.periodo,
                    };

                    vendaVarejoService
                        .chartMarca(args)
                        .then(
                        function (response) {
                            if (response.Status < 0) {
                                $scope.tools.toastr.error(response.Message, 'Serviço');
                                console.error(response.Exception);
                            } else {
                                $timeout(function () {
                                    $scope.charts.marca.vazio =
                                        toolsService.buildChart("#chart-marca", "R$", response.Data);
                                });
                            }
                            $scope.charts.marca.carregando = false;
                        },
                        function (_error) {
                            $scope.charts.marca.carregando = false;
                            $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                            console.error(_error);
                        }
                        );
                },
            },
            desempenhoLoja: {
                carregando: false,
                vazio: false,
                data: [],
                getAll: function () {
                    $scope.charts.desempenhoLoja.carregando = true;
                    $scope.charts.desempenhoLoja.vazio = false;
                    vendaVarejoService
                        .getDesempenhoLoja($scope.state.filtro.args)
                        .then(
                        function (response) {
                            if (response.Status < 0) {
                                $scope.tools.toastr.error(response.Message, 'Serviço');
                                console.error(response.Exception);
                            } else {
                                angular.copy(angular.fromJson(response.Data), $scope.charts.desempenhoLoja.data);
                                $scope.charts.desempenhoLoja.vazio = (!response.Data || !response.Data.length);
                            }
                            $scope.charts.desempenhoLoja.carregando = false;
                        },
                        function (_error) {
                            $scope.charts.desempenhoLoja.carregando = false;
                            $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                            console.error(_error);
                        }
                        );
                },
            },
            desempenhoVendedor: {
                carregando: false,
                vazio: false,
                data: [],
                getAll: function () {
                    $scope.charts.desempenhoVendedor.carregando = true;
                    $scope.charts.desempenhoVendedor.vazio = false;

                    /* comproe o filtro do desempenho de vendedor que é baseado em ItemVendaVarejo */
                    var args = {
                        filtro: {
                            VendaVarejo: $scope.state.filtro.args.filtro,
                        },
                        tipoPeriodo: $scope.state.filtro.args.tipoPeriodo,
                        periodo: $scope.state.filtro.args.periodo,
                    };

                    vendaVarejoService
                        .getDesempenhoVendedor(args)
                        .then(
                        function (response) {
                            if (response.Status < 0) {
                                $scope.tools.toastr.error(response.Message, 'Serviço');
                                console.error(response.Exception);
                            } else {
                                angular.copy(angular.fromJson(response.Data), $scope.charts.desempenhoVendedor.data);
                                $scope.charts.desempenhoVendedor.vazio = (!response.Data || !response.Data.length);
                            }
                            $scope.charts.desempenhoVendedor.carregando = false;
                        },
                        function (_error) {
                            $scope.charts.desempenhoVendedor.carregando = false;
                            $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                            console.error(_error);
                        }
                        );
                },
            },
            desempenhoProduto: {
                carregando: false,
                vazio: false,
                data: [],
                getAll: function () {
                    $scope.charts.desempenhoProduto.carregando = true;
                    $scope.charts.desempenhoProduto.vazio = false;

                    /* comproe o filtro do desempenho de vendedor que é baseado em ItemVendaVarejo */
                    var args = {
                        filtro: {
                            VendaVarejo: $scope.state.filtro.args.filtro,
                        },
                        tipoPeriodo: $scope.state.filtro.args.tipoPeriodo,
                        periodo: $scope.state.filtro.args.periodo,
                    };

                    vendaVarejoService
                        .getDesempenhoProduto(args)
                        .then(
                        function (response) {
                            if (response.Status < 0) {
                                $scope.tools.toastr.error(response.Message, 'Serviço');
                                console.error(response.Exception);
                            } else {
                                angular.copy(angular.fromJson(response.Data), $scope.charts.desempenhoProduto.data);
                                $scope.charts.desempenhoProduto.vazio = (!response.Data || !response.Data.length);
                            }
                            $scope.charts.desempenhoProduto.carregando = false;
                        },
                        function (_error) {
                            $scope.charts.desempenhoProduto.carregando = false;
                            $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                            console.error(_error);
                        }
                        );
                },
            },
        };
        $scope.auxiliar = {
            status: {
                data: [
                    { Codigo: 1, Nome: "Concluído" },
                    { Codigo: 2, Nome: "Cancelado" },
                ],
            },
            filial: {
                data: [],
                filtro: {
                    args: {
                        filtro: {
                            IndicaFilial: true,
                            Ativo: true,
                            Filial: {
                                IndicaLoja: true,
                                Ativa: true
                            },
                        },
                        sortExpression: '[Nome]',
                        skip: 0,
                        take: 9999,
                    },
                },
                carregando: false,
                vazio: false,
                getAll: function () {
                    $scope.auxiliar.filial.carregando = true;
                    $scope.auxiliar.filial.vazio = false;
                    lookupService
                        .getAllLoja($scope.auxiliar.filial.filtro.args)
                        .then(
                        function (response) {
                            if (response.Status < 0) {
                                $scope.tools.toastr.error(response.Message, 'Serviço');
                            } else {
                                angular.copy(angular.fromJson(response.Data), $scope.auxiliar.filial.data);
                            }
                            $scope.auxiliar.filial.carregando = false;
                            $scope.auxiliar.filial.vazio = (!response.Data || !response.Data.length);
                        },
                        function (_error) {
                            $scope.auxiliar.filial.carregando = false;
                            $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                        });
                },
            },
        };

        /* funções */
        $scope.initialize = function () {
            $scope.clearFilter();
        };

        $scope.refresh = function () {
            $scope.auxiliar.filial.getAll();
            $scope.charts.totais.getAll();

            switch ($scope.tabs.corrente) {
                case $scope.tabs.enum.vendas: {
                    $scope.charts.evolucaoVenda.fillChart();
                    $scope.charts.evolucaoVendaAcumulada.fillChart();
                    $scope.charts.desempenhoLoja.getAll();
                    break;
                }
                case $scope.tabs.enum.vendedores: {
                    $scope.charts.desempenhoVendedor.getAll();
                    break;
                }
                case $scope.tabs.enum.produtos: {
                    $scope.charts.grupo.fillChart();
                    $scope.charts.subgrupo.fillChart();
                    $scope.charts.tipo.fillChart();
                    $scope.charts.colecao.fillChart();
                    $scope.charts.linha.fillChart();
                    $scope.charts.marca.fillChart();
                    $scope.charts.desempenhoProduto.getAll();
                    break;
                }
                case $scope.tabs.enum.crm: {
                    break;
                }
                case $scope.tabs.enum.fidelidade: {
                    break;
                }
            };
        };

        $scope.clearFilter = function () {
            $scope.state.filtro.args = {
                filtro: {
                    Status: 1, //concluido: 1, cancelado: 2
                },
                tipoPeriodo: 0, //hoje, ontem, 7-dias, no-mes, no-ano, personalizado
                periodo: { De: null, Ate: null },
            },
                $scope.refresh();
        };
        $scope.toggleFilter = function () {
            $scope.state.filtro.ativo = !$scope.state.filtro.ativo;
        };

        $scope.initialize();

    }

})();